home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fritz: All Fritz
/
All Fritz.zip
/
All Fritz
/
FILES
/
PROGBLER
/
WHIZZARD.LZH
/
BANDDEMO.BAS
< prev
next >
Wrap
BASIC Source File
|
1984-07-06
|
13KB
|
332 lines
10 REM
20 REM BANDDEMO date: June 16, 1984
30 REM
40 REM Demonstrate advantages of ASMBASIC versus standard BASICA print
50 REM statements.
60 REM
70 REM This program is written for running under BASICA version 2.0,
80 REM with Rayhawk Automation NW ASMBASIC.EXE previously executed to
90 REM provide assembler interfaces to the IBM PC ROM screen drivers.
100 REM
110 REM Throughput is demonstrated to speed up by a factor of 5 by
120 REM bypassing the BASIC PRINT statement. Using Rayhawk Automation
130 REM BASPRINT.EXE the same result can be accomplished for interpreted
131 REM BASIC programs.
132 REM
133 REM ****** The real program starts at 2000
135 REM
140 REM If your program just uses PRINT statements just execute
142 REM
144 REM BASPRINT.EXE for interpreted BASIC on the IBM
148 REM COMPRINT.EXE for compiled BASIC, compiled without the /O option
152 REM PRSLASHO.EXE for compiled BASIC, compiled with the /O option
160 REM
162 REM If your interpreted program uses the QPRINT subroutine from ASMBASIC
164 REM then lines 190 and 250 to 860 must be executed in your program.
166 REM ASMBASIC.EXE must be run once every time you boot, ( use AUTOEXEC.BAT),
168 REM the PC. Then it will be in memory ready to be used by your program.
170 REM If your compiled program uses the QPRINT subroutine then link it using
172 REM QPRINT.OBJ. This is supplied with the diskette so that you do not need
174 REM the assembler to process QPRINT.ASM.
178 REM
180 DIM A$(20),T$(20)
190 DEFINT S,I
192 DIM IIA(40)
200 KEY OFF
210 FOR I = 1 TO 10
220 KEY I,""
230 NEXT I
240 REM
242 REM Determine whether we are running compiled or interpreted
244 REM FLAG% = 0 if interpreted
246 REM FLAG% = 1 if compiled without /O (needs BASRUN.EXE)
247 REM FLAG% = 2 if compiled with /O
248 REM FLAG% = 3 if business basic compiled
249 REM
250 DEF SEG
260 TEST$ = "K"
270 A% = VARPTR(TEST$)
280 B% = PEEK(A%+1) + 256*PEEK(A%+2)
290 IF CHR$(PEEK(B%)) = "K" THEN FLAG% = 0 : GOTO 360
300 B% = PEEK(A%+2) + 256*PEEK(A%+3)
310 IF CHR$(PEEK(B%)) <> "K" THEN FLAG% = 3 : GOTO 880
312 WIDTH 80 : IF PEEK(&H7CC) = 80 THEN FLAG% = 1 ELSE FLAG% = 2
320 GOTO 880
330 REM
340 REM If interpreted, check that ASMBASIC is resident below the interpreter
350 REM
360 DEF SEG = 0
370 A% = PEEK(&H19C) + 256*PEEK(&H19D) : B% = PEEK(&H19E) + 256*PEEK(&H19F)
380 DEF SEG = B%
390 IF (PEEK(A%-1) = &H52) AND (PEEK(A%-2) = &H52) THEN ASM%=1:GOTO 470
400 CLS : PRINT TAB(85);"ASMBASIC must be executed once before starting"
410 PRINT TAB(15);"the Basic interpreter"
420 ASM% = 0
430 GOTO 880
440 REM
450 REM If interpreted, then get the segment and offset of the utility routines
460 REM
470 DEF SEG
480 DIM INIT%(3) ' setup subroutine containing INT 67h
490 INIT%(1) = &H67CD ' RETF 2
500 INIT%(2) = &H2CA
510 INIT%(3) = 0
520 SUBINIT = 0
530 REM
540 REM get the code segment of the utility subroutines
550 SEGVALUE% = 0
560 SUBINIT = VARPTR(INIT%(1)): CALL SUBINIT(SEGVALUE%)
570 REM
580 REM get the offset of the utility subroutines
590 A% = 1
600 SUBINIT = VARPTR(INIT%(1)):CALL SUBINIT(A%)
610 QPRINT = A%
620 A% = 2
630 SUBINIT = VARPTR(INIT%(1)):CALL SUBINIT(A%)
640 SCRLDN = A%
650 A% = 3
660 SUBINIT = VARPTR(INIT%(1)):CALL SUBINIT(A%)
670 SCRLUP = A%
680 A% = 4
690 SUBINIT = VARPTR(INIT%(1)):CALL SUBINIT(A%)
700 XREP = A%
710 A% = 5
720 SUBINIT = VARPTR(INIT%(1)):CALL SUBINIT(A%)
730 YREP = A%
740 A% = 6
750 SUBINIT = VARPTR(INIT%(1)):CALL SUBINIT(A%)
760 CLREOL = A%
770 A% = 7
780 SUBINIT = VARPTR(INIT%(1)):CALL SUBINIT(A%)
790 CLREOS = A%
800 A% = 8
810 SUBINIT = VARPTR(INIT%(1)):CALL SUBINIT(A%)
820 ZPRINT = A%
830 REM
840 REM set the segment value for interpreted basic
845 REM this is used by BASIC for all interpreted CALLs to QPRINT,
848 REM SCRLDN, etc. and must be valid prior to each such CALL.
850 REM
860 DEF SEG = SEGVALUE%
870 REM
880 REM define some attributes for use throughout the demo
890 IF FLAG% = 0 THEN GOTO 930 ELSE DEF SEG
900 ' check for comprint or prslasho, prslasho will be in the demo
910 ' if 40 lines take less than 2 seconds comprint or prslasho is here
915 CLS ' first initialize comprint or prslasho if compiled !!!!!!!
920 STARTTIME$=TIME$
922 FOR I = 1 TO 40:
923 LOCATE 1,1:PRINT " TESTING IF COMPRINT OR PRSLASHO ARE PRESENT"
924 NEXT I
927 ENDTIME$ = TIME$
928 GOSUB 2840: IF DIFTIME# < 2! THEN BASPRINT%=1 ELSE BASPRINT% = 0
929 GOTO 1000
930 DEF SEG = 0 ' interpreted, check for basprint
940 B02D0% = PEEK(&H2D0):B02D1%=PEEK(&H2D1):B02D2%=PEEK(&H2D2):B02D3%=PEEK(&H2D3)
950 ' PRINT " CHECKING FOR BASPRINT 0:02D0 = ";HEX$(B02D1%);" ";HEX$(B02D0%);" ";HEX$(B02D3%);" ";HEX$(B02D2%)
960 IF B02D1% = 0 THEN BASPRINT% = 1 ELSE BASPRINT% = 0
962 ' if ASMBASIC has been run, then restore the DEF SEG value so ASMBASIC
964 ' routines can be used
970 IF ASM% =1 THEN DEF SEG = SEGVALUE% ELSE DEF SEG
980 REM
990 REM
1000 IF FLAG% = 0 THEN PRINT " INTERPRETED "
1010 IF FLAG% = 1 THEN PRINT " COMPILED WITHOUT /O, NEEDS BASRUN.EXE "
1012 IF FLAG% = 1 THEN PRINT " COMPILED WITH /O "
1020 IF FLAG% = 3 THEN PRINT " BUSINESS BASIC COMPILED "
1030 IF FLAG% = 0 AND ASM% = 0 THEN PRINT " ASMBASIC NOT PRESENT"
1040 IF FLAG% = 0 AND ASM% = 1 THEN PRINT " ASMBASIC PRESENT"
1050 IF FLAG% > 0 AND BASPRINT% = 0 THEN PRINT " COMPRINT OR PRSLASHO ARE NOT PRESENT "
1060 IF FLAG% > 0 AND BASPRINT% = 1 THEN PRINT " COMPRINT OR PRSLASHO ARE PRESENT"
1070 IF FLAG% = 0 AND BASPRINT% = 0 THEN PRINT " BASPRINT NOT PRESENT"
1080 IF FLAG% = 0 AND BASPRINT% = 1 THEN PRINT " BASPRINT PRESENT"
1095 ' while inkey$ <> "":wend
1100 ' input " enter to continue ";junk$
1110 ' CLS : LOCATE 4,4 : INPUT "Would you like the demonstration in color (Y/N)";AA$
1112 AA$="N"
1120 IF AA$ = "Y" OR AA$ = "y" THEN 1320
1130 IF AA$ <> "N" AND AA$ <> "n" THEN 1080
1140 REM
1150 REM black and white attributes
1160 REM
1170 NORMAL% = 7 ' normal intensity white on black
1180 BLUE% = 7
1190 GREEN% = 7
1200 CYAN% = 7
1210 RED% = 7
1220 MAGENTA% = 7
1230 BROWN% = 7
1240 YELLOW% = 7
1250 WHITE% = 15 ' high intensity white on black
1260 LIGHTER% = 7
1270 BLINK% = 128
1280 GOTO 1570
1290 REM
1300 REM color attributes
1310 REM
1320 NORMAL% = 7 ' normal intensity white on black
1330 BLUE% = 1
1340 GREEN% = 2
1350 CYAN% = 3
1360 RED% = 4
1370 MAGENTA% = 5
1380 BROWN% = 6
1390 YELLOW% = 14
1400 WHITE% = 15 ' high intensity white on black
1410 REM
1420 REM To make a color lighter, logically OR the LIGHTER% with
1430 REM the color.
1440 REM Ex: ATTRIBUTE% = RED% OR LIGHTER%
1450 REM will give a light red color.
1460 REM
1470 LIGHTER% = 8
1480 REM
1490 REM To make a color blink, logically OR the BLINK% with
1500 REM the color.
1510 REM Ex: ATTRIBUTE% = RED% OR BLINK%
1520 REM will give a blinking red color.
1530 REM
1540 BLINK% = 128
1550 REM
1560 REM
1570 REM
1580 REM
1600 REM
2000 REM ************* The real program starts here
2010 REM
2015 REM Show how slow standard BASIC print statements are.
2020 REM Print A$(1) TO A$(5) in boxes, with origins in the array IIA(40)
2030 REM
2040 REM Then show how fast ASMBASIC routines QPRINT is. This is also how
2050 REM fast BASPRINT makes the routines
2060 REM
2070 REM If BASPRINT is resident, then do not use A$(1) contents as STANDARD
2080 REM BASIC, use A$ to show how fast BASPRINT is.
2100 RESTORE 2110
2101 IWRITES = 11:IJ=0
2102 FOR I = 1 TO IWRITES:IJ=IJ+1:READ IIA(IJ):IJ=IJ+1:READ IIA(IJ):NEXT I
2110 DATA 7,27,1,1,1,27,1,55,7,55,13,55,19,55,19,27,19,1,13,1,7,1
2125 BLANKIT$=SPACE$(25)
2130 CLS
2135 AA$="HIT ANY KEY TO STOP THE DEMO"
2140 LOCATE 15,27:
2150 IF FLAG%>0 OR ASM% = 1 THEN CALL QPRINT (FLAG%, AA$) ELSE PRINT AA$;
2190 IF FLAG% = 0 AND BASPRINT% = 0 THEN GOTO 2210
2200 IF FLAG% = 0 AND BASPRINT% = 1 THEN GOTO 3200
2205 IF FLAG% > 0 AND BASPRINT% = 1 THEN GOTO 4200
2206 IF FLAG% > 0 AND BASPRINT% = 0 THEN GOTO 5200
2210 ' interpreted with ASMBASIC present, but BASPRINT is not present
2220 ' this means slow slow BASIC print statements
2230 A$(1)="*************************"
2231 A$(2)="* GET OFF THE SLOW *"
2232 A$(3)="* MERRY-GO-ROUND *"
2233 A$(4)="* OF INTERPRETED BASIC *"
2234 A$(5)="* PRINT STATEMENTS *"
2235 A$(6)="*************************"
2240 GOSUB 6000 ' use PRINT
2250 IF ASM% = 1 THEN GOSUB 2400 ' set up and use QPRINT if ASMBASIC has run
2255 IF INKEY$ <> "" THEN SYSTEM
2260 GOTO 2210 ' infinite loop
2400 ' SHOW HOW FAST ASMBASIC STATEMENTS ARE
2425 BLANKIT$=SPACE$(25)
2430 A$(1)="*************************"
2431 A$(2)="* GET ON THE *"
2432 A$(3)="* BANDWAGON *"
2433 A$(4)="* WITH CLUBware ASMBASIC*"
2434 A$(5)="* QPRINT STATEMENTS *"
2435 A$(6)="*************************"
2440 IF FLAG% = 0 THEN ILOOP = 5 ELSE ILOOP = 10
2450 FOR IB = 1 TO ILOOP
2460 GOSUB 6200
2470 NEXT IB
2480 RETURN
2840 REM TIMING SUBROUTINE
2850 REM inputs: STARTTIME$
2860 REM ENDTIME$
2870 REM output: DIFTIME# time in seconds
2880 SHH#=VAL(LEFT$(STARTTIME$,2))
2890 EHH#=VAL(LEFT$(ENDTIME$,2))
2900 SSS#=VAL(RIGHT$(STARTTIME$,2))
2910 ESS#=VAL(RIGHT$(ENDTIME$,2))
2920 SMM#=VAL(MID$(STARTTIME$,4,2))
2930 EMM#=VAL(MID$(ENDTIME$,4,2))
2940 STIME#=SHH#*3600!+SMM#*60!+SSS#
2950 ETIME#=EHH#*3600!+EMM#*60!+ESS#
2960 DIFTIME#=ETIME#-STIME#
2970 IF DIFTIME# < 0! THEN DIFTIME#= DIFTIME# + 3600! * 24!
2980 RETURN
2990 REM
3200 ' SHOW HOW FAST BASPRINT SPEEDS UP INTERPRETED BASIC PRINT STATEMENTS
3225 BLANKIT$=SPACE$(25)
3230 A$(1)="*************************"
3231 A$(2)="* CLUBware BASPRINT.EXE *"
3232 A$(3)="* speeds up *"
3233 A$(4)="* Interpreted BASIC *"
3234 A$(5)="* PRINTs 6 times *"
3235 A$(6)="*************************"
3250 FOR IB = 1 TO 5
3260 GOSUB 6000 ' use print statements around the screen
3270 NEXT IB
3280 IF ASM%=1 THEN GOSUB 2400 ' use QPRINT calls around the screen
3300 GOTO 3200 ' infinite loop
3310 REM
4200 ' SHOW HOW FAST PRSLASHO or COMPRINT SPEEDS UP COMPILED BASIC PRINTS
4225 BLANKIT$=SPACE$(25)
4230 A$(1)="*************************"
4231 A$(2)="* CLUBware PRSLASHO.EXE *"
4232 A$(3)="* speeds up *"
4233 A$(4)="* Compiled BASIC *"
4234 A$(5)="* PRINTs 6 times *"
4235 A$(6)="*************************"
4236 IF FLAG% = 1 THEN A$(2)="* CLUBware COMPRINT.EXE *"
4250 FOR IB = 1 TO 5
4260 GOSUB 6000 ' use print statements around the screen
4262 IF INKEY$ <> "" THEN SYSTEM
4270 NEXT IB
4275 GOSUB 2400 ' use QPRINT statements around the screen
4285 IF INKEY$ <> "" THEN SYSTEM
4300 GOTO 4200 ' infinite loop
4310 REM
5200 ' compiled BASIC, COMPRINT or PRSLASHO not present.
5220 ' this means slow slow BASIC print statements
5230 A$(1)="*************************"
5231 A$(2)="* GET OFF THE SLOW *"
5232 A$(3)="* MERRYGOROUND *"
5233 A$(4)="* OF COMPILED BASIC *"
5234 A$(5)="* PRINT STATEMENTS *"
5235 A$(6)="*************************"
5240 GOSUB 6000 ' use PRINT
5250 GOSUB 2400 ' set up and use QPRINT
5255 IF INKEY$ <> "" THEN SYSTEM
5260 GOTO 5200 ' infinite loop
5270 REM
6000 REM ' use standard BASIC PRINT statements - slow, slower, slowest
6036 FOR I = 1 TO IWRITES
6040 IROW = IIA(I+I-1)
6050 ICOL = IIA(I+I)
6060 FOR IJ = 1 TO 6:LOCATE IROW,ICOL:PRINT A$(IJ);:IROW = IROW+1:NEXT IJ
6080 IK = I-1
6090 IF I = 1 THEN IK = IWRITES
6092 IF I = 2 THEN GOTO 6150 ' leave the center statement
6100 IROW = IIA(IK+IK-1)
6110 ICOL = IIA(IK+IK)
6120 FOR IJ = 1 TO 6:LOCATE IROW,ICOL:PRINT BLANKIT$;:IROW = IROW+1:NEXT IJ
6142 IF INKEY$ <> "" THEN SYSTEM
6150 NEXT I
6160 RETURN
6170 REM
6200 REM ' use ASMBASIC QPRINT statements
6236 FOR I = 1 TO IWRITES
6240 IROW = IIA(I+I-1)
6250 ICOL = IIA(I+I)
6254 FOR IJ = 1 TO 6:LOCATE IROW,ICOL:CALL QPRINT (FLAG%, A$(IJ)):IROW=IROW+1:NEXT IJ
6280 IK = I-1
6290 IF I = 1 THEN IK = IWRITES
6292 IF I = 2 THEN GOTO 6350 ' leave the center statement
6300 IROW = IIA(IK+IK-1)
6310 ICOL = IIA(IK+IK)
6320 FOR IJ = 1 TO 6:LOCATE IROW,ICOL:CALL QPRINT (FLAG%, BLANKIT$):IROW=IROW+1:NEXT IJ
6342 IF INKEY$ <> "" THEN SYSTEM
6350 NEXT I
6360 RETURN